package com.kyk.service.impl;

import com.kyk.service.IUploadService;
import com.kyk.util.CodeUtil;
import com.kyk.util.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;

@Service
public class UploadServiceImpl implements IUploadService {


    @Value("${upload.webPath}")
    String webPath; // 现在配置为相对路径：/upload/
    @Value("${upload.diskPath}")
    String diskPath; // 磁盘路径：E:/PX_code/三期/upload/


    @Override
    public Result upload(MultipartFile file) {
        String dir = diskPath;
        String originalFileName = file.getOriginalFilename();

        // 处理文件名可能不含扩展名的情况
        if (originalFileName == null || originalFileName.lastIndexOf(".") == -1) {
            return new Result(CodeUtil.ADD_ERROR, "文件格式错误，必须包含扩展名（如.jpg、.png）");
        }

        // 截取文件名后缀，生成新文件名（UUID避免重复）
        String suffix = originalFileName.substring(originalFileName.lastIndexOf("."));
        String newName = UUID.randomUUID() + suffix;

        // 构造磁盘路径（本地存储路径）
        String diskFilePath = dir + newName;
        // 构造web访问路径（相对路径，前端需根据实际域名/端口拼接完整URL）
        String webFilePath = webPath + newName; // 结果为：/upload/xxx.jpg

        // 保存文件（确保目录存在）
        try {
            File saveDir = new File(dir);
            if (!saveDir.exists()) {
                saveDir.mkdirs(); // 自动创建多级目录
            }
            file.transferTo(new File(diskFilePath));
        } catch (IOException e) {
            return new Result(CodeUtil.ADD_ERROR, "文件上传失败：" + e.getMessage());
        }
        return new Result(CodeUtil.ADD_OK, "文件上传成功", webFilePath);
    }


    @Override
    public Result deleteFile(String webPathParam) {
        // 1. 验证参数
        if (webPathParam == null || webPathParam.isEmpty()) {
            return new Result(CodeUtil.DELETE_ERROR, "文件路径不能为空");
        }

        // 2. 解析传入的路径，提取相对路径部分（兼容前端传入完整URL或相对路径）
        String path;
        try {
            // 如果传入的是完整URL（如http://localhost:8002/upload/xxx.jpg），提取路径部分
            URL url = new URL(webPathParam);
            path = url.getPath(); // 提取结果：/upload/xxx.jpg
        } catch (MalformedURLException e) {
            // 如果传入的是相对路径（如/upload/xxx.jpg），直接使用
            path = webPathParam;
        }

        // 3. 验证路径是否匹配系统配置的webPath（/upload/）
        if (!path.startsWith(webPath)) {
            return new Result(CodeUtil.DELETE_ERROR, "文件路径格式错误，不匹配系统配置");
        }

        // 4. 截取文件名（从相对路径中提取xxx.jpg）
        String fileName = path.substring(webPath.length());

        // 5. 构造本地磁盘文件路径并删除
        String diskFilePath = diskPath + fileName;
        File file = new File(diskFilePath);

        if (file.exists() && file.isFile()) {
            boolean isDeleted = file.delete();
            if (isDeleted) {
                return new Result(CodeUtil.DELETE_OK, "文件删除成功");
            } else {
                return new Result(CodeUtil.DELETE_ERROR, "文件删除失败（权限不足或文件被占用）");
            }
        } else {
            return new Result(CodeUtil.DELETE_ERROR, "文件不存在：" + diskFilePath);
        }
    }
}
